package InternetCode.Udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/*
 * 服务器端，实现基于UDP的用户登陆
 */
public class UDPServer {//公共类
    public static void main(String[] args) throws IOException {//主程序入口
        /*
         * 接收客户端发送的数据
         */
        // 1.创建服务器端DatagramSocket，指定端口
        DatagramSocket socket = new DatagramSocket(8800);
        // 2.创建数据报，用于接收客户端发送的数据
        byte[] data = new byte[1024];//创建字节数组，指定接收的数据包的大小
        DatagramPacket packet = new DatagramPacket(data, data.length);

        // 3.接收客户端发送的数据
        System.out.println("****服务器端已经启动，等待客户端发送数据");//输出提示信息
        //通过循环不停的向客户接收数据
        new Thread(()->{
            while(true) {
                try {
                    socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 4.读取数据
                String info = new String(data, 0, packet.getLength());//创建字符串对象
                System.out.println("我是服务器，客户端说：" + info);//输出提示信息

            }
        }).start();

        final InetAddress[] address = {null};
        final int[] port = {0};
        final boolean[] flag = {false};
        //向客户端发送信息
        new Thread(()->{
        while (true){
            if(!flag[0]){
                // 1.定义客户端的地址、端口号、数据
                address[0] = packet.getAddress();//获取发送端的地址
                port[0] = packet.getPort();//获取 发送端进程所绑定的端口
                flag[0] = true;
            }
            Scanner scanner = new Scanner(System.in);//从键盘接受数据
            String send = scanner.nextLine();//nextLine方式接受字符串
            byte[] data2 = send.getBytes();//将接收到的数据转换为字节数组
            DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address[0], port[0]);// 2.创建数据报，包含响应的数据信息
            try {
                socket.send(packet2); // 3.响应客户端
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        }).start();


    }
}
